package com.djf.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.djf.entity.Order;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 订单Mapper接口
 * 
 * @author djf
 * @since 2024-01-20
 */
@Mapper
public interface OrderMapper extends BaseMapper<Order> {

    /**
     * 根据用户ID查询订单
     * 
     * @param userId 用户ID
     * @return 订单列表
     */
    @Select("SELECT * FROM t_order WHERE user_id = #{userId} AND deleted = 0 ORDER BY create_time DESC")
    List<Order> selectByUserId(@Param("userId") Long userId);

    /**
     * 根据用户ID查询订单（别名方法，与联表查询服务保持一致）
     * 
     * @param userId 用户ID
     * @return 订单列表
     */
    default List<Order> getOrdersByUserId(Long userId) {
        return selectByUserId(userId);
    }

    /**
     * 根据租户ID查询订单
     * 
     * @param tenantId 租户ID
     * @return 订单列表
     */
    @Select("SELECT * FROM t_order WHERE tenant_id = #{tenantId} AND deleted = 0 ORDER BY create_time DESC")
    List<Order> selectByTenantId(@Param("tenantId") Long tenantId);

    /**
     * 根据时间范围查询订单
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 订单列表
     */
    @Select("SELECT * FROM t_order WHERE create_time >= #{startTime} AND create_time <= #{endTime} AND deleted = 0 ORDER BY create_time DESC")
    List<Order> selectByTimeRange(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);

    /**
     * 根据用户ID和时间范围查询订单
     * 
     * @param userId 用户ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 订单列表
     */
    @Select("SELECT * FROM t_order WHERE user_id = #{userId} AND create_time >= #{startTime} AND create_time <= #{endTime} AND deleted = 0 ORDER BY create_time DESC")
    List<Order> selectByUserIdAndTimeRange(@Param("userId") Long userId, 
                                          @Param("startTime") LocalDateTime startTime, 
                                          @Param("endTime") LocalDateTime endTime);

    /**
     * 根据租户ID和时间范围查询订单
     * 
     * @param tenantId 租户ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 订单列表
     */
    @Select("SELECT * FROM t_order WHERE tenant_id = #{tenantId} AND create_time >= #{startTime} AND create_time <= #{endTime} AND deleted = 0 ORDER BY create_time DESC")
    List<Order> selectByTenantIdAndTimeRange(@Param("tenantId") Long tenantId, 
                                            @Param("startTime") LocalDateTime startTime, 
                                            @Param("endTime") LocalDateTime endTime);

    /**
     * 根据租户ID和时间范围查询订单（别名方法，与联表查询服务保持一致）
     * 
     * @param tenantId 租户ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 订单列表
     */
    default List<Order> getOrdersByTenantIdAndTimeRange(Long tenantId, LocalDateTime startTime, LocalDateTime endTime) {
        return selectByTenantIdAndTimeRange(tenantId, startTime, endTime);
    }

    /**
     * 根据订单ID列表批量查询订单
     * 
     * @param orderIds 订单ID列表
     * @return 订单列表
     */
    @Select("<script>" +
            "SELECT * FROM t_order WHERE id IN " +
            "<foreach collection='orderIds' item='orderId' open='(' separator=',' close=')'>" +
            "#{orderId}" +
            "</foreach>" +
            " AND deleted = 0 ORDER BY create_time DESC" +
            "</script>")
    List<Order> getOrdersByIds(@Param("orderIds") List<Long> orderIds);

    /**
     * 统计指定时间范围内的订单数量
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 订单数量
     */
    @Select("SELECT COUNT(*) FROM t_order WHERE create_time >= #{startTime} AND create_time <= #{endTime} AND deleted = 0")
    Long countByTimeRange(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);
}